package com.atguigu.gmall.mq.listerner;

import com.atguigu.gmall.mq.config.DeadLetterMqConfig;
import com.atguigu.gmall.mq.config.DelayedMqConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * @author 李旭
 * @date 2022/1/21 11:36
 * @Description:
 */
@Component
public class MessageListener {

    //接收延迟消息  基于插件的
    @RabbitListener(queues = DelayedMqConfig.queue_delay_1)
    public void receiverDelayMessage(String msg, Channel channel, Message message){
        try {
            System.out.println("接收到的消息是msg：" + msg + ":接收的时间：" + new Date());
            //应答
            //参数1：消息的唯一标识
            //参数2：是否批量应答 （预取值有关系）
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } catch (Exception e) {
            //e.printStackTrace();
            //判断当前消息是已经被投递过了
            if(message.getMessageProperties().isRedelivered()){
                //第二次了
                //参数1：消息的唯一标识
                //参数2：是否要求再投递一次  true:再给你一次 false:不给了
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else{
                //当前消息未被投递过    //希望再给一次机会  我再消费一次
                //参数1：消息的唯一标识
                //参数2：是否批量应答 （预取值有关系）
                //参数3：是否要求再投递一次  true:再给你一次 false:不给了
                try {
                    channel.basicNack(message.getMessageProperties().getDeliveryTag()
                            ,false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }
        }

    }

    //接收延迟消息  基于死信的
    @RabbitListener(queues = DeadLetterMqConfig.queue_dead_2)
    public void receiverDeadLetterMessage(String msg, Channel channel, Message message){
        try {
            System.out.println("接收到的消息是msg：" + msg + ":接收的时间：" + new Date());
            //应答
            //参数1：消息的唯一标识
            //参数2：是否批量应答 （预取值有关系）
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } catch (Exception e) {
            //e.printStackTrace();
            //判断当前消息是已经被投递过了
            if(message.getMessageProperties().isRedelivered()){
                //第二次了
                //参数1：消息的唯一标识
                //参数2：是否要求再投递一次  true:再给你一次 false:不给了
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else{
                //当前消息未被投递过    //希望再给一次机会  我再消费一次
                //参数1：消息的唯一标识
                //参数2：是否批量应答 （预取值有关系）
                //参数3：是否要求再投递一次  true:再给你一次 false:不给了
                try {
                    channel.basicNack(message.getMessageProperties().getDeliveryTag()
                            ,false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }
        }

    }






    //接收消息
    @RabbitListener(queues = "queue123")
    public void receiverMessage(String msg, Channel channel, Message message){
        try {
            System.out.println("接收到的消息是msg：" + msg);
            System.out.println("接收到的消息是message:body：" + new String(message.getBody()));
            int i = 10/0;//算术异常 属于RuntimeException
            //应答
            //参数1：消息的唯一标识
            //参数2：是否批量应答 （预取值有关系）
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } catch (Exception e) {
            //e.printStackTrace();
            //判断当前消息是已经被投递过了
            if(message.getMessageProperties().isRedelivered()){
                //第二次了
                //参数1：消息的唯一标识
                //参数2：是否要求再投递一次  true:再给你一次 false:不给了
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else{
                //当前消息未被投递过    //希望再给一次机会  我再消费一次
                //参数1：消息的唯一标识
                //参数2：是否批量应答 （预取值有关系）
                //参数3：是否要求再投递一次  true:再给你一次 false:不给了
                try {
                    channel.basicNack(message.getMessageProperties().getDeliveryTag()
                    ,false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }
        }

    }
}
